#include <stdio.h>
void create(int a[16][16]);
void print(int a[16][16]);
int selectwin(int a[16][16],int x, int y);
int main(){
    int s=256;
    int i, j;
    int a[16][16];
    create(a);
    do{
        printf("请第一位选手下棋:\n");
        scanf("%d%d", &i, &j);
        while(a[i][j]!=43){
            printf("落子错误，请重新选择落子位置\n");
            scanf("%d%d", &i, &j);
        }
        a[i][j]=48;
        s--;
        print(a);
        if(selectwin(a,i,j)==48){
            printf("恭喜玩家一获胜!\n");
            break;
        }
        printf("请第二位选手下棋:\n");
        scanf("%d%d", &i, &j);
        while(a[i][j]!=43){
            printf("落子错误，请重新选择落子位置\n");
            scanf("%d%d", &i, &j);
        }        
        a[i][j]=49; 
        s--;
        print(a);
        if(selectwin(a,i,j)==49){
            printf("恭喜玩家二获胜!\n");
            break;
        }
    }while(s>0);
    if(s==0)
        printf("和棋");
    return 0;
}
//棋盘构造函数
void create(int a[16][16]){
    int m=0,n=1;
    for(int i=0; i<1; i++){
        for(int j=0; j<16; j++){
            a[i][j]=m;
            m++;
        }
    } 
    for(int i=1; i<16; i++){
        for(int j=0; j<1; j++){
            a[i][j]=n;
            n++;
        }
    } 
    for(int i=1; i<16; i++){
        for(int j=1; j<16; j++){
            a[i][j]=43;
        }
    }
    for(int i=0; i<16; i++){
        if(i<1){
            for(int j=0; j<16; j++){
                if(j<15)
                    printf("%.2d  ", a[i][j]);
                else
                    printf("%.2d  \n\n", a[i][j]);
            }
        }
        else{
            for(int k=0; k<16; k++){
                if(k<1){
                    printf("%.2d  ",a[i][k]);
                }
                else if(k<15){
                    printf("%c   ",a[i][k]);
                }
                else
                    printf("%c   \n\n",a[i][k]);
                
            }

        }
    }   
    printf("\n");
}
//落子后棋盘更新函数
void print(int a[16][16]){
    for(int i=0; i<16; i++){
        if(i<1){
            for(int j=0; j<16; j++){
                if(j<15)
                    printf("%.2d  ", a[i][j]);
                else
                    printf("%.2d  \n\n", a[i][j]);
            }
        }
        else{
            for(int k=0; k<16; k++){
                if(k<1){
                    printf("%.2d  ",a[i][k]);
                }
                else if(k<15){
                    printf("%c   ",a[i][k]);
                }
                else
                    printf("%c   \n\n",a[i][k]);
                
            }

        }
    }  
    printf("\n");
}
//输赢判定函数
int selectwin(int a[16][16],int i, int j){
    //12点钟方向开始，顺时针判断
    //横向
    for(int i=1; i<16; i++){
        for( int j=1; j<16; j++){
            if(a[i][j]==a[i][j+1] && a[i][j+1]==a[i][j+2] && a[i][j+2]==a[i][j+3] && a[i][j+3]==a[i][j+4] && a[i][j]!=43){
                return a[i][j];
            }
        }
    }
    //纵向
    for(int i=1; i<16; i++){
        for( int j=1; j<16; j++){
            if(a[i][j]==a[i+1][j] && a[i+1][j]==a[i+2][j] && a[i+2][j]==a[i+3][j] && a[i+3][j]==a[i+4][j] && a[i][j]!=43){
                return a[i][j];
            }
        }
    }
    //主对角线
    for(int i=1; i<16; i++){
        for(int j=1; j<16; j++){
            if(a[i][j]==a[i+1][j+1] && a[i+1][j+1]==a[i+2][j+2] && a[i+2][j+2]==a[i+3][j+3] && a[i+3][j+3]==a[i+4][j+4] && a[i][j]!=43){
                return a[i][j];        
            }
        }
    }
    //副对角线
    for(int i=1; i<16; i++){
        for(int j=1; j<16; j++){
            if(a[i][j]==a[i-1][j+1] && a[i-1][j+1]==a[i-2][j+2] && a[i-2][j+2]==a[i-3][j+3] && a[i-3][j+3]==a[i-4][j+4] && a[i][j]!=43){
                return a[i][j];        
            }
        } 
    }
    return 0;
}  

